/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.beans;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.util.*;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.cookies.FilterCookie;
import org.openide.src.*;
import org.openide.src.nodes.ClassChildren;
import org.openide.src.nodes.ElementNodeFactory;
import org.openide.util.WeakListener;
/** Implements children for basic source code patterns
*
* @author Petr Hrebejk, Jan Jancura
*/
public class PatternChildren extends ClassChildren {
private boolean wri = true;
private MethodElementListener methodListener = new MethodElementListener();
private FieldElementListener fieldListener = new FieldElementListener();
private PropertyChangeListener weakMethodListener = WeakListener.propertyChange( methodListener, null);
// = new WeakListener.PropertyChange( methodListener );
private PropertyChangeListener weakFieldListener = WeakListener.propertyChange( fieldListener, null); ;
// = new WeakListener.PropertyChange( fieldListener );
static {
Integer i = new Integer (PatternFilter.METHOD | PatternFilter.PROPERTY |
PatternFilter.IDXPROPERTY | PatternFilter.EVENT_SET
);
propToFilter.put (ElementProperties.PROP_METHODS, i);
i = new Integer (PatternFilter.FIELD | PatternFilter.PROPERTY |
PatternFilter.IDXPROPERTY | PatternFilter.EVENT_SET
);
propToFilter.put (ElementProperties.PROP_FIELDS, i);
}
/** Object for finding patterns in class */
private PatternAnalyser patternAnalyser;
// Constructors -----------------------------------------------------------------------
/** Create pattern children. The children are initilay unfiltered.
* @param elemrent the atteached class. For this class we recognize the patterns
*/
public PatternChildren (ClassElement classElement) {
super (classElement);
patternAnalyser = new PatternAnalyser( classElement );
}
public PatternChildren (ClassElement classElement, boolean isWritable ) {
this (classElement);
wri = isWritable;
}
/** Create pattern children. The children are initilay unfiltered.
* @param elemrent the atteached class. For this class we recognize the patterns
*/
public PatternChildren (ElementNodeFactory factory, ClassElement classElement) {
super (factory, classElement);
patternAnalyser = new PatternAnalyser( classElement );
}
public PatternChildren (ElementNodeFactory factory, ClassElement classElement, boolean isWritable ) {
this (factory, classElement);
wri = isWritable;
}
/*
PatternChildren cloneChildren() {
return.clone();
System.out.println ( "CLONING CHILDREN" );
return new PatternChildren( patternAnalyser.getClassElement() );
}
*/
// FilterCookie implementation --------------------------------------------------------
/** Updates all the keys (elements) according to the current filter &
* ordering.
*/
protected void refreshAllKeys () {
cpl = new Collection [getOrder ().length];
refreshKeys (PatternFilter.ALL);
}
/** Updates all the keys with given filter. Overriden to provide package access tothis method.
*/
protected void refreshKeys (int filter) {
// Method is added or removed ve have to re-analyze the pattern abd to
// registrate Children as listener
reassignMethodListener();
reassignFieldListener();
patternAnalyser.analyzeAll();
super.refreshKeys (filter);
//Thread.dumpStack();
}
/** @return The class of currently associated filter or null
* if no filter is associated with these children
*/
public Class getFilterClass () {
return PatternFilter.class;
}
/** Gets the pattern analyser which manages the patterns */
PatternAnalyser getPatternAnalyser( ) {
return patternAnalyser;
}
// Children.keys implementation -------------------------------------------------------
/** Creates node for given key.
*/
protected Node[] createNodes (Object key ) {
if (key instanceof IdxPropertyPattern)
return new Node[] { new IdxPropertyPatternNode((IdxPropertyPattern)key, wri) };
if (key instanceof PropertyPattern)
return new Node[] { new PropertyPatternNode((PropertyPattern)key, wri) };
if (key instanceof EventSetPattern)
return new Node[] { new EventSetPatternNode((EventSetPattern)key, wri) };
// Unknown pattern
return super.createNodes (key);
}
// Utility methods --------------------------------------------------------------------
protected Collection getKeysOfType (int elementType) {
LinkedList keys = (LinkedList) super.getKeysOfType (elementType);
LinkedList temp = null;
if ((elementType & PatternFilter.PROPERTY) != 0) {
temp = new LinkedList();
temp.addAll( patternAnalyser.getPropertyPatterns() );
Collections.sort( temp, new PatternComparator() );
keys.addAll( temp );
//keys.addAll( patternAnalyser.getPropertyPatterns() );
}
if ((elementType & PatternFilter.IDXPROPERTY) != 0) {
temp = new LinkedList();
temp.addAll( patternAnalyser.getIdxPropertyPatterns() );
Collections.sort( temp, new PatternComparator() );
keys.addAll( temp );
//keys.addAll( patternAnalyser.getIdxPropertyPatterns() );
}
if ((elementType & PatternFilter.EVENT_SET) != 0) {
temp = new LinkedList();
temp.addAll( patternAnalyser.getEventSetPatterns() );
Collections.sort( temp, new PatternComparator() );
keys.addAll( temp );
//keys.addAll( patternAnalyser.getEventSetPatterns() );
}
// if ((filter == null) || filter.isSorted ())
// Collections.sort (keys, comparator);
return keys;
}
/** Method for removing method listener */
private void reassignMethodListener() {
MethodElement[] methods = element.getMethods();
for ( int i = 0; i < methods.length ; i++ ) {
methods[i].removePropertyChangeListener( weakMethodListener );
methods[i].addPropertyChangeListener( weakMethodListener );
}
}
/** Method for removing field listener */
private void reassignFieldListener() {
FieldElement[] fields = element.getFields();
for ( int i = 0; i < fields.length ; i++ ) {
fields[i].removePropertyChangeListener( weakFieldListener );
fields[i].addPropertyChangeListener( weakFieldListener );
}
}
// Inner classes ----------------------------------------------------------------------
/** The listener of method changes temporary used in PatternAnalyser to
* track changes in
*/
final class MethodElementListener implements PropertyChangeListener {
public void propertyChange ( PropertyChangeEvent e ) {
refreshKeys(PatternFilter.ALL);
//patternAnalyser.analyzeAll();
}
}
/** The listener of method changes temporary used in PatternAnalyser to
* track changes in
*/
final class FieldElementListener implements PropertyChangeListener {
public void propertyChange ( PropertyChangeEvent e ) {
refreshKeys(PatternFilter.ALL);
//reassignFieldListener();
//patternAnalyser.resolveFields();
}
}
private static final class PatternComparator implements Comparator {
public int compare( Object a, Object b ) {
return ((Pattern)a).getName().compareTo( ((Pattern)b ).getName() );
}
public boolean equals( Object c ) {
return c instanceof PatternComparator;
}
}
}
/*
* Log
* 11 Gandalf 1.10 1/15/00 Petr Hrebejk BugFix 5386, 5385, 5393
* and new WeakListener implementation
* 10 Gandalf 1.9 10/22/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 9 Gandalf 1.8 7/28/99 Petr Hrebejk Property Mode change fix
* 8 Gandalf 1.7 7/26/99 Petr Hrebejk Better implementation of
* patterns resolving
* 7 Gandalf 1.6 7/21/99 Petr Hrebejk Debug messages removed
* 6 Gandalf 1.5 7/21/99 Petr Hrebejk
* 5 Gandalf 1.4 7/21/99 Petr Hamernik some filter bugfix
* 4 Gandalf 1.3 7/20/99 Petr Hrebejk
* 3 Gandalf 1.2 7/3/99 Ian Formanek Overriden method
* refreshKeys to provide access to classes in thes package and make it
* compilable
* 2 Gandalf 1.1 7/1/99 Jan Jancura Object Browser support
* 1 Gandalf 1.0 6/28/99 Petr Hrebejk
* $
*/